﻿#include "classforhostdiscover.h"
#include "ui_classforhostdiscover.h"
#include <iostream>
#include <appbase.h>
#include <chmsnetworkbase.h>
#include <chmslog.h>

#include <QDateTime>
#include <QHostAddress>
#include <QHostInfo>
#include <QProcess>
#include <QSettings>

ClassForHostDiscover::ClassForHostDiscover(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClassForHostDiscover)
{
    ui->setupUi(this);

    // 程序基础配置
    pAppBase = new AppBase;

    /*
     * 读取 qss 皮肤文件
     * */
    QFile objFileSkin(":/res/Style/hostdiscover.qss");
    QString varQStrSkin;
    if(objFileSkin.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream qssInput(&objFileSkin);
        while(!qssInput.atEnd())
        {
            varQStrSkin += qssInput.readLine();
        }
    }
    objFileSkin.close();
    this->setStyleSheet(varQStrSkin);

    // 全局对象与变量初始化
    pObjOprOfExplorer = new QProcess;
    pObjQTabWidOfHostDis = new QTabWidget;

    // 初始化控件
    funVoidControlInitialize();


    /*
     * 全局信号槽
     * */

    // WINDOWS 资源管理器命令
    QString varQStrCmdOfExplorer = "explorer";
    // 获取运行结果目录
    QStringList varQStrListCmdOfExplorerArg = {QDir::toNativeSeparators(qApp->applicationDirPath()) + "\\RunLog"};

    // 运行结果目录 按钮 事件
    connect(ui->pusButOfOpenDir,&QPushButton::clicked,this,[=](){
        //pObjOprOfExplorer->start(varQStrCmdOfExplorer, varQStrListCmdOfExplorerArg);
        pObjOprOfExplorer->startDetached(varQStrCmdOfExplorer, varQStrListCmdOfExplorerArg);
    });
    // 清空显示区 按钮 事件
    connect(ui->pusButOftxtEdMessClear,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOftxtEdClear);
    // 恢复默认值 按钮事件
    connect(ui->pusButOfRestoreDefault,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfControlInitializeOfThird);

    /*
     * 第一标签页
     * */

    // 对象和变量初始化
    pObjOprOfPing = new QProcess;
    pObjOprOfArp = new QProcess;

    // 单击 刷新IP地址 按钮 事件
    connect(ui->pusButOfRefreshSourceIP1_1_3,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    // 单击 ping/stop 按钮
    connect(ui->pusButOfPing1_1_1,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfIcmpPing);
    // 单击 ARP/stop 按钮
    connect(ui->pusButOfArp1_1_2,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfArpClick);
    // 单击 IPv4 RadioButton 按钮
    //connect(ui->rButOfIPv41_1_1,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    connect(ui->rButOfIPv41_1_1,&QRadioButton::clicked,this,[this]{
        ui->pusButOfArp1_1_2->setEnabled(true);
        ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
    });
    // 单击 IPv6 RadioButton 按钮
    //connect(ui->rButOfIPv61_1_2,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    connect(ui->rButOfIPv61_1_2,&QRadioButton::clicked,this,[this]{
        ui->pusButOfArp1_1_2->setEnabled(false);
        ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
    });
    // ICMP 的长 ping 处理
    connect(ui->chBoxOfLongPing1_1_2,&QCheckBox::stateChanged,this,[=]{
        if(ui->chBoxOfLongPing1_1_2->isChecked())
        {
            ui->spinBoxOfCountPing1_1_1->setEnabled(false);
        }
        else
        {
            ui->spinBoxOfCountPing1_1_1->setEnabled(true);
        }
    });
    // PING 命令运行结束时 ARP/STOP 按钮的处理
    connect(pObjOprOfPing,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),pObjOprOfPing,[=](){
        ui->pusButOfArp1_1_2->setEnabled(true);
    });

    // ARP 命令运行结束时 PING/STOP 按钮的处理
    connect(pObjOprOfArp,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),pObjOprOfArp,[=](){
        ui->pusButOfPing1_1_1->setEnabled(true);
    });

    // 处理源IP地址选项
    connect(ui->chBoxOfSourceAddress1_1_3,&QCheckBox::stateChanged,this,[=]{
        if(ui->comBoxOfSourceAddress1_1_1->count() > 0)
        {
            ui->comBoxOfSourceAddress1_1_1->clear();
            ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
        }
        else
        {
            ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
        }
    });


    /*
     * 第二标签页
     * */

    // 对象和变量初始化
    pObjOprOfTracert = new QProcess(this);

    // 单击 IPv4 RadioButton 按钮
    connect(ui->rButOfIPv42_1_1,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPv6OfSecond);
    // 单击 IPv6 RadioButton 按钮
    connect(ui->rButOfIPv62_1_2,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPv6OfSecond);
    // 单击 刷新IP地址 按钮 事件
    connect(ui->pusButOfRefreshIP2_1_2,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPv6OfSecond);
    // 单击 追踪 按钮 事件
    connect(ui->pusButOfTracert2_1_1,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotOfTracertOfSecond);



    /*
     * 第三标签页
     * */

    // 对象与变量初始化
    pObjQprOfTcpPort = new QProcess(this);
    pObjQprOfTcpPort->setReadChannel(QProcess::StandardOutput);
    // 初始获取本地IP地址
    ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();

    // 单击 刷新IP地址 按钮 事件
    connect(ui->pusButOfRefreshIP3_1_2,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    // 单击 IPv4 RadioButton 按钮
    connect(ui->rButOfIPv43_1_5,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    // 单击 IPv6 RadioButton 按钮
    connect(ui->rButOfIPv63_1_6,&QRadioButton::clicked,this,&ClassForHostDiscover::funSlotsOfGetLocalIPOfThird);
    // 单击 探测 按钮
    connect(ui->pusButOfScan3_1_1,&QPushButton::clicked,this,&ClassForHostDiscover::funVoidTcpCmdArguments);
    // TCP探测 的 HTTP模式处理
    connect(ui->chBoxOfHTTP3_1_1,&QCheckBox::stateChanged,this,[=]{
        if(ui->chBoxOfHTTP3_1_1->isChecked())
        {
            ui->chBoxOfPost3_1_4->setEnabled(true);
            ui->chBoxOfHead3_1_5->setEnabled(true);
        }
        else
        {
            ui->chBoxOfPost3_1_4->setEnabled(false);
            ui->chBoxOfHead3_1_5->setEnabled(false);
        }
    });

    // TCP探测 的 长TCPping 处理
    connect(ui->chBoxOfPerPing3_1_2,&QCheckBox::stateChanged,this,[=]{
        if(ui->chBoxOfPerPing3_1_2->isChecked())
        {
            ui->spinBoxOfCountPing3_1_1->setEnabled(false);
        }
        else
        {
            ui->spinBoxOfCountPing3_1_1->setEnabled(true);
        }
    });
    // 处理源IP地址选项
    connect(ui->chBoxOfSourPing3_1_3,&QCheckBox::stateChanged,this,[=]{
        if(ui->comBoxOfSourceIP3_1_1->count() > 0)
        {
            ui->comBoxOfSourceIP3_1_1->clear();
            ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
        }
        else
        {
            ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
        }
    });


    /*
     * 第四标签页
     * */

    // 对象与变量初始化
    pObjQprOfNslookup = new QProcess;
    pFormOfDnsIni = new ClassForDnsIniForm();

    // DNS 选项的响应
    connect(ui->chBoxOfDns4_1_1,&QCheckBox::stateChanged,this,[=](){
        if(ui->chBoxOfDns4_1_1->isChecked())
        {
            //ui->comBoxOfDnsList4_1_1->clear();
            varQStrListOfSendDnsData.clear();
            ui->comBoxOfDnsList4_1_1->setEnabled(1);
            ui->pusButOfDnsList4_1_2->setEnabled(1);
            ClassForHostDiscover::funVoidReadDnsIni();
            ClassForHostDiscover::funVoidAddItemToCombo();
        }
        else
        {
            ui->comBoxOfDnsList4_1_1->setEnabled(0);
            ui->pusButOfDnsList4_1_2->setEnabled(0);
        }
    });
    // 单击 解析 按钮事件
    connect(ui->pusButOfNslookup4_1_1,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfNslookup);

    // 单击 DNS列表 按钮事件 事件内向子窗口传送数据
    connect(ui->pusButOfDnsList4_1_2,&QPushButton::clicked,this,&ClassForHostDiscover::funSlotsOfOpenDnsEditForm);
    // 向DNS子窗口发送数据的槽函数
    connect(this,&ClassForHostDiscover::signalOfSend2DnsForm,pFormOfDnsIni,&ClassForDnsIniForm::funSlotsOfReceiveDnsData);

    // 接收从子窗口返回的数据
    connect(pFormOfDnsIni,&ClassForDnsIniForm::signalOfSendToParent,this,&ClassForHostDiscover::funSlotsOfProcessingDataForSub);

}

ClassForHostDiscover::~ClassForHostDiscover()
{
    // 保存标签页位置
    varCurrentTab = QString::number(ui->tabWidgetProbe->currentIndex());
    pAppBase->funVoidWriteConfig("HostDiscover","tabOfDiscover",varCurrentTab);

    delete pObjOprOfExplorer;
    delete pObjQTabWidOfHostDis;
    delete pObjOprOfArp;
    delete pObjOprOfPing;
    delete pObjOprOfTracert;
    delete pObjQprOfTcpPort;
    delete pObjQprOfNslookup;
    delete pAppBase;
    delete pFormOfDnsIni;
    delete ui;
}

// 全局 初始化控件
void ClassForHostDiscover::funVoidControlInitialize() const
{
    QString varQStrConfig = "";
    varQStrConfig = pAppBase->funQStrReadConfig("HostDiscover","tabOfDiscover");
    ui->tabWidgetProbe->setCurrentIndex(varQStrConfig.toInt());

    /*
     * 第一标签页 控件初始化
     * */
    ui->rButOfIPv41_1_1->setChecked(true); // 默认选中 ipv4
    ui->rButOfIPv61_1_2->setChecked(false); // 默认不选中 IPV6
    ui->linEdOfIPAddress1_1_1->clear(); // 清空地址栏
    ui->chBoxOfLongPing1_1_2->setChecked(false); // 默认不选中长  ping
    ui->chBoxOfSizeOfBuffer1_1_4->setChecked(false); // 缓冲区大小
    ui->chBoxOfSourceAddress1_1_3->setChecked(false); // 源地址
    ui->chBoxOfUnfrag1_1_1->setChecked(false); // 默认 分片 不选中
    ui->chBoxOfTTL1_1_5->setChecked(false); // 默认 TTL 不选中
    ui->spinBoxOfCountPing1_1_1->setValue(0); // 长ping/发送几个 初始值为 0
    ui->spinBoxOfCountPing1_1_1->setEnabled(true); // 长ping/发送几个 初始可用
    ui->spinBoxOfSizeOfBuffer1_1_2->setValue(1024); // 缓冲区值 可用
    ui->spinBoxOfTTL1_1_3->setValue(128); // TTL 默认值
    ui->pusButOfArp1_1_2->setEnabled(true); // ARP/STOP 按钮可用

    /*
     * 第二标签页 控件初始化
     * */
    ui->rButOfIPv42_1_1->setChecked(true); // 默认选中 IPV4
    ui->rButOfIPv62_1_2->setChecked(false); //默认不选中 IPV6
    ui->linEdOfDestAddress2_1_1->clear(); // 清空 文本输入框
    ui->chBoxOfNotResolvedHostname2_1_1->setChecked(true); // 默认选中 不将地址解析成主机名(会加快追踪速度)
    ui->chBoxOfMaximm_hops2_1_4->setChecked(false); // 最大跃点数
    ui->chBoxOfTimeout2_1_5->setChecked(false); // 等待每个回复的超时时间(以毫秒为单位)
    ui->spinBoxOfMaximm_hops2_1_1->setValue(2); // 最大跃点数范围
    ui->spinBoxOfTimeout2_1_2->setValue(3); // 超时时间
    ui->chBoxOfRoundTripPath2_1_2->setChecked(false); // 默认补选中 追踪往返行程路径
    ui->chBoxOfRoundTripPath2_1_2->setEnabled(false); // 默认设置为不可用,因为默认为 IPV4 但是这是 IPV6 的参数
    ui->chBoxOfSourAddress2_1_3->setChecked(false); // 源IP 默认不选中
    ui->chBoxOfSourAddress2_1_3->setEnabled(false); // 源IP 默认不可用
    ui->comBoxOfSourceIP2_1_1->setEnabled(false); // 默认这里不可用
    ui->pusButOfRefreshIP2_1_2->setEnabled(false); // 默认 刷新IP地址 按钮不可用
    ui->txtEdOfMessage2_2_1->clear();

    /*
     * 第三标签页 控件初始化
     * */
    ui->linEdOfDestAddress3_1_1->clear(); // 清空 IP/域名 输入文本框
    ui->spinBoxOfPort3_1_3->setValue(443); // 设置默认端口号
    ui->chBoxOfHTTP3_1_1->setChecked(false); // HTTP 模式 复选框
    ui->chBoxOfPost3_1_4->setChecked(false); // post 复选框 非选中状态
    ui->chBoxOfPost3_1_4->setEnabled(false); // post 复选框 可编辑状态
    ui->chBoxOfHead3_1_5->setChecked(false); // head 复选框 非选中状态
    ui->chBoxOfHead3_1_5->setEnabled(false); // head 复选框 可编辑状态
    ui->chBoxOfPerPing3_1_2->setChecked(false); // 长ping复选框状态
    ui->spinBoxOfCountPing3_1_1->setValue(0); // 默认这个值为 0 表示采用默认命令方式,不适用-n参数
    ui->spinBoxOfCountPing3_1_1->setEnabled(true); // ping几次的输入框
    ui->chBoxOfTimer3_1_9->setChecked(false); // 间隔时间参数
    ui->spinBoxOfTimer3_1_2->setValue(3); // 默认间隔时间为 3 秒
    ui->chBoxOfDateTime3_1_6->setChecked(false); // 日期时间
    ui->chBoxOfJitter3_1_8->setChecked(false); // 抖动
    ui->chBoxOfSucceed3_1_7->setChecked(false); // 成功就退出/失败
    ui->spinBoxOfFail3_1_4->setValue(0); // 失败几次退出,默认值0
    ui->chBoxOfArgf3_1_11->setChecked(false); // 至少发送一个字节
    ui->chBoxOfReload3_1_10->setChecked(false);
    ui->spinBoxOfReload3_1_5->setValue(0); // 探测几次后重新解析
    ui->chBoxOfSourPing3_1_3->setChecked(false); // 是否使用源IP
    ui->rButOfIPv43_1_5->setChecked(true); // IPV4
    ui->rButOfIPv63_1_6->setChecked(false); // IPV6
    ui->txtEdOfMessage3_2_1->clear(); // 清空 信息回显框

    /*
     * 第四标签页 控件初始化
     * */
    ui->chBoxOfDns4_1_1->setChecked(0);
    ui->comBoxOfDnsList4_1_1->setEnabled(0);
    ui->pusButOfDnsList4_1_2->setEnabled(0);
}

// 获取本地IP地址
void ClassForHostDiscover::funSlotsOfGetLocalIPOfThird()
{
    if(ui->tabIcmpPing->isVisible())
    {
        // 判断是否已经有IP地址
        if(ui->comBoxOfSourceAddress1_1_1->count() > 0)
        {
            ui->comBoxOfSourceAddress1_1_1->clear();
        }
        QString varQStrLocalIPv4_1 = "";
        QString varQStrLocalIPv6_1 = "";
        QString varQStrhostName_1 = QHostInfo::localHostName();
        QHostInfo varQHostInfo_1 = QHostInfo::fromName(varQStrhostName_1);
        QList<QHostAddress> varListOfIP_1 = varQHostInfo_1.addresses();

        if(varListOfIP_1.empty()) // 判断是否无法获取IP地址
        {
            return;
        }
        foreach (QHostAddress addr, varListOfIP_1) {
            if((addr.protocol() == QAbstractSocket::IPv4Protocol) && ui->rButOfIPv41_1_1->isChecked()){ // 获取IPV4地址
                varQStrLocalIPv4_1 = addr.toString();
                ui->comBoxOfSourceAddress1_1_1->addItem(varQStrLocalIPv4_1);
            }
            if((addr.protocol() == QAbstractSocket::IPv6Protocol) && ui->rButOfIPv61_1_2->isChecked()){ // 获取IPV6地址
                varQStrLocalIPv6_1 = addr.toString();
                ui->comBoxOfSourceAddress1_1_1->addItem(varQStrLocalIPv6_1);
            }
        }
    }
    else if(ui->tabTcpUdp->isVisible())
    {
        // 判断是否已经有IP地址
        if(ui->comBoxOfSourceIP3_1_1->count() > 0)
        {
            ui->comBoxOfSourceIP3_1_1->clear();
        }
        QString varQStrLocalIPv4_2 = "";
        QString varQStrLocalIPv6_2 = "";
        QString varQStrhostName_2 = QHostInfo::localHostName();
        QHostInfo varQHostInfo_2 = QHostInfo::fromName(varQStrhostName_2);
        QList<QHostAddress> varListOfIP_2 = varQHostInfo_2.addresses();

        if(varListOfIP_2.empty()) // 判断是否无法获取IP地址
        {
            return;
        }
        foreach (QHostAddress addr, varListOfIP_2) {
            if((addr.protocol() == QAbstractSocket::IPv4Protocol) && ui->rButOfIPv43_1_5->isChecked()){ // 获取IPV4地址
                varQStrLocalIPv4_2 = addr.toString();
                ui->comBoxOfSourceIP3_1_1->addItem(varQStrLocalIPv4_2);
            }
            if((addr.protocol() == QAbstractSocket::IPv6Protocol) && ui->rButOfIPv63_1_6->isChecked()){ // 获取IPV6地址
                varQStrLocalIPv6_2 = addr.toString();
                ui->comBoxOfSourceIP3_1_1->addItem(varQStrLocalIPv6_2);
            }
        }
    }
}

// 运行结果写入文件
void ClassForHostDiscover::funVoidRunLogOfWrite(QString &LogOfType, QString &RunLog)
{
    // 当日
    QString today="";
    // 此时
    QString rightNow="";
    // 文件路径
    QString filePath = "";
    // 文件名
    QString fileName = "";

    // 行尾
    //const QString lineEnd_WIN = "\r\n";

    ChMSAppPath ObjChMSAppPath;

    today = QDateTime::currentDateTime().toString("yyyyMMddhh");
    rightNow = QDateTime::currentDateTime().toString("dd-hh:mm:ss.zzz ");

    filePath = ObjChMSAppPath.appPath + "/RunLog/";
    fileName = ObjChMSAppPath.appPath + "/RunLog/" + LogOfType + ("-") + today + (".txt");

    /*
     * 中文转码
     * */
    //QString chineseLog = ChMSTc.funQStrTextCodec(RunLog);

    QDir objQDir(filePath);
    QFile file(fileName);
    QTextStream out(&file);

    if(!objQDir.exists()){ // 检查目录是否存在
        if(!objQDir.mkdir("../RunLog")){ // 不存在就建立
            return;
        }
    }

    if (!file.open(QIODevice::Append)){ // 打开日志文件，写入
        file.close();
        return;
    }
    // 输出日志记录
    out << RunLog;
    file.close();

    return;
}

// 点击 清空显示区 按钮事件
void ClassForHostDiscover::funSlotsOftxtEdClear()
{
    if(ui->tabIcmpPing->isVisible())
    {
        ui->txtEdOfMessage1_2_1->clear();
    }
    else if(ui->tabIcmpTracert->isVisible())
    {
        ui->txtEdOfMessage2_2_1->clear();
    }
    else if(ui->tabTcpUdp->isVisible())
    {
        ui->txtEdOfMessage3_2_1->clear();
    }
    else if(ui->tabNslookup->isVisible())
    {
        ui->txtEdOfMessage4_2_1->clear();
    }
}

// 点击 恢复默认值 按钮事件
void ClassForHostDiscover::funSlotsOfControlInitializeOfThird()
{
    ChMSTextCodec ChMSTc;
    if(ui->tabIcmpPing->isVisible())
    {
        /*
         * 第一标签页 控件恢复默认值
         * */

        if(pObjOprOfPing->processId() > 0 || pObjOprOfArp->processId() > 0)
        {
            QByteArray varQByArrTemp = "正在运行的 PING 命令已经停止,界面正在初始化。请重新点击 “ping/stop” 按钮开始！";
            QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

            pObjOprOfPing->closeReadChannel(QProcess::StandardOutput);
            pObjOprOfPing->closeWriteChannel();
            pObjOprOfPing->terminate();
            pObjOprOfPing->kill();
            ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾
            // 输出正常显示信息
            ui->txtEdOfMessage1_2_1->insertPlainText("\r\n\r\n");
            ui->txtEdOfMessage1_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
            ui->txtEdOfMessage1_2_1->insertPlainText("\r\n");
            ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
            ui->txtEdOfMessage1_2_1->update(); // 更新显示
        }

        ui->rButOfIPv41_1_1->setChecked(true);
        ui->rButOfIPv61_1_2->setChecked(false);
        ui->linEdOfIPAddress1_1_1->clear();
        ui->chBoxOfLongPing1_1_2->setChecked(false);
        ui->chBoxOfSizeOfBuffer1_1_4->setChecked(false);
        ui->chBoxOfSourceAddress1_1_3->setChecked(false);
        ui->chBoxOfUnfrag1_1_1->setChecked(false);
        ui->chBoxOfTTL1_1_5->setChecked(false);
        ui->spinBoxOfCountPing1_1_1->setValue(0);
        ui->spinBoxOfCountPing1_1_1->setEnabled(true);
        ui->spinBoxOfSizeOfBuffer1_1_2->setValue(1024);
        ui->spinBoxOfTTL1_1_3->setValue(128);
        ui->pusButOfArp1_1_2->setEnabled(true);
    }
    else if(ui->tabIcmpTracert->isVisible())
    {
        /*
         * 第二标签页 控件恢复默认值
         * */

        if(pObjOprOfTracert->processId() > 0)
        {
            QByteArray varQByArrTemp = "正在运行的 Tracert 路由追踪命令已经停止，界面正在进行初始化。请重新点击 “追踪/停止” 按钮开始追踪路由路径！";
            QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

            pObjOprOfTracert->closeReadChannel(QProcess::StandardOutput);
            pObjOprOfTracert->closeWriteChannel();
            pObjOprOfTracert->terminate();
            pObjOprOfTracert->kill();
            ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾
            // 输出正常显示信息
            ui->txtEdOfMessage2_2_1->insertPlainText("\r\n\r\n");
            ui->txtEdOfMessage2_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
            ui->txtEdOfMessage2_2_1->insertPlainText("\r\n");
            ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
            ui->txtEdOfMessage2_2_1->update(); // 更新显示
        }

        ui->rButOfIPv42_1_1->setChecked(true); // 默认选中 IPV4
        ui->rButOfIPv62_1_2->setChecked(false); //默认不选中 IPV6
        ui->linEdOfDestAddress2_1_1->clear(); // 清空 文本输入框
        ui->chBoxOfNotResolvedHostname2_1_1->setChecked(true); // 默认选中 不将地址解析成主机名(会加快追踪速度)
        ui->chBoxOfMaximm_hops2_1_4->setChecked(false); // 最大跃点数
        ui->chBoxOfTimeout2_1_5->setChecked(false); // 等待每个回复的超时时间(以毫秒为单位)
        ui->spinBoxOfMaximm_hops2_1_1->setValue(2); // 最大跃点数范围
        ui->spinBoxOfTimeout2_1_2->setValue(3); // 超时时间
        ui->chBoxOfRoundTripPath2_1_2->setChecked(false); // 默认补选中 追踪往返行程路径
        ui->chBoxOfRoundTripPath2_1_2->setEnabled(false); // 默认设置为不可用,因为默认为 IPV4 但是这是 IPV6 的参数
        ui->chBoxOfSourAddress2_1_3->setChecked(false); // 源IP 默认不选中
        ui->chBoxOfSourAddress2_1_3->setEnabled(false); // 源IP 默认不可用
        ui->comBoxOfSourceIP2_1_1->setEnabled(false); // 默认这里不可用
        ui->pusButOfRefreshIP2_1_2->setEnabled(false); // 默认 刷新IP地址 按钮不可用
        ui->txtEdOfMessage2_2_1->clear();

    }
    else if(ui->tabTcpUdp->isVisible())
    {
        /*
         * 第三标签页 空间恢复默认值
         * */

        if(pObjQprOfTcpPort->processId() > 0)
        {
            QByteArray varQByArrTemp = "正在运行的 TCPing 探测命令已经停止，界面正在进行初始化。请重新点击 “探测” 按钮开始探测！";
            QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

            pObjQprOfTcpPort->closeReadChannel(QProcess::StandardOutput);
            pObjQprOfTcpPort->closeWriteChannel();
            pObjQprOfTcpPort->terminate();
            pObjQprOfTcpPort->kill();
            ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾
            // 输出正常显示信息
            ui->txtEdOfMessage3_2_1->insertPlainText("\r\n\r\n");
            ui->txtEdOfMessage3_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
            ui->txtEdOfMessage3_2_1->insertPlainText("\r\n");
            ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
            ui->txtEdOfMessage3_2_1->update(); // 更新显示
        }

        ui->linEdOfDestAddress3_1_1->clear(); // 清空 IP/域名 输入文本框
        ui->spinBoxOfPort3_1_3->setValue(443); // 设置默认端口号
        ui->chBoxOfHTTP3_1_1->setChecked(false); // HTTP 模式 复选框
        ui->chBoxOfPost3_1_4->setChecked(false); // post 复选框 非选中状态
        ui->chBoxOfPost3_1_4->setEnabled(false); // post 复选框 可编辑状态
        ui->chBoxOfHead3_1_5->setChecked(false); // head 复选框 非选中状态
        ui->chBoxOfHead3_1_5->setEnabled(false); // head 复选框 可编辑状态

        ui->chBoxOfPerPing3_1_2->setChecked(false); // 长ping复选框状态
        ui->spinBoxOfCountPing3_1_1->setValue(0); // 默认这个值为 0 表示采用默认命令方式,不适用-n参数
        ui->spinBoxOfCountPing3_1_1->setEnabled(true); // ping几次的输入框
        ui->chBoxOfTimer3_1_9->setChecked(false); // 间隔时间参数
        ui->spinBoxOfTimer3_1_2->setValue(3); // 默认间隔时间为 3 秒
        ui->chBoxOfDateTime3_1_6->setChecked(false); // 日期时间
        ui->chBoxOfJitter3_1_8->setChecked(false); // 抖动
        ui->chBoxOfSucceed3_1_7->setChecked(false); // 成功就退出/失败
        ui->spinBoxOfFail3_1_4->setValue(0); // 失败几次退出,默认值0
        ui->chBoxOfArgf3_1_11->setChecked(false); // 至少发送一个字节
        ui->chBoxOfReload3_1_10->setChecked(false);
        ui->spinBoxOfReload3_1_5->setValue(0); // 探测几次后重新解析
        ui->chBoxOfSourPing3_1_3->setChecked(false); // 是否使用源IP
        ui->rButOfIPv43_1_5->setChecked(true); // IPV4
        ui->rButOfIPv63_1_6->setChecked(false); // IPV6
        //ui->txtEdOfMessage3_2_1->clear(); // 清空 信息回显框
        ClassForHostDiscover::funSlotsOfGetLocalIPOfThird();
    }
    else if(ui->tabNslookup->isVisible())
    {
        /*
         * 第四标签页
         * */

        ui->linEdOfDomainName4_1_1->clear();
        ui->comBoxOfDnsList4_1_1->clearEditText();
        ui->chBoxOfDns4_1_1->setChecked(0);
        ui->comBoxOfDnsList4_1_1->setEnabled(0);
        ui->pusButOfDnsList4_1_2->setEnabled(0);
    }
}

// 第一标签页 ping/stop 按钮点击 事件
void ClassForHostDiscover::funSlotsOfIcmpPing()
{
    ChMSTextCodec ChMSTc;
    if(pObjOprOfPing->processId() > 0)
    {
        QByteArray varQByArrTemp = "PING 命令已经停止。请重新点击 “ping/stop” 按钮开始！";
        QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

        pObjOprOfPing->closeReadChannel(QProcess::StandardOutput);
        pObjOprOfPing->closeWriteChannel();
        pObjOprOfPing->terminate();
        pObjOprOfPing->kill();

        ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

        // 输出正常显示信息
        ui->txtEdOfMessage1_2_1->insertPlainText("\r\n\r\n");
        ui->txtEdOfMessage1_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
        ui->txtEdOfMessage1_2_1->insertPlainText("\r\n");
        ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage1_2_1->update(); // 更新显示
        return;
    }

    /*
     * 变量申请
     * */
    QStringList varQStrListPing; // 命令参数

    QString varCmdPing = "PING "; // PING 命令

    QString varQStrOfCmdArgu_tn = ""; // 长ping/发送几次
    QString varQStrOfCmdArgu_tn_count = ""; // 长ping/发送几次
    QString varQStrOfCmdArgu_S = ""; // 使用源地址
    QString varQStrOfCmdArgu_S_sourceAdd = ""; // 使用源地址
    QString varQStrOfCmdArgu_ip46 = ""; // ipv4
    QString varQStrOfCmdArgu_l = ""; // 使用缓冲区大小
    QString varQStrOfCmdArgu_l_BuffSize = ""; // 缓冲区大小
    QString varQStrOfCmdArgu_f = ""; // 不分片
    QString varQStrOfCmdArgu_i = ""; // 使用TTL
    QString varQStrOfCmdArgu_i_Size = ""; // TTL值

    QString varQStrOfCmdArgu_inetAddr = ""; // 目的IP地址

    // 长ping
    if(ui->chBoxOfLongPing1_1_2->isChecked())
    {
        varQStrOfCmdArgu_tn = "-t";
        varQStrListPing << varQStrOfCmdArgu_tn;
    }
    else
    {
        if(ui->spinBoxOfCountPing1_1_1->text().toInt() > 0)
        {
            varQStrOfCmdArgu_tn = "-n";
            varQStrOfCmdArgu_tn_count = ui->spinBoxOfCountPing1_1_1->text();
            varQStrListPing << varQStrOfCmdArgu_tn << varQStrOfCmdArgu_tn_count;
        }
    }

    // 缓冲区大小
    if(ui->chBoxOfSizeOfBuffer1_1_4->isChecked())
    {
        varQStrOfCmdArgu_l = "-l";
        varQStrOfCmdArgu_l_BuffSize = ui->spinBoxOfSizeOfBuffer1_1_2->text();
        varQStrListPing << varQStrOfCmdArgu_l << varQStrOfCmdArgu_l_BuffSize;
    }

    // 不分片
    if(ui->chBoxOfUnfrag1_1_1->isChecked())
    {
        varQStrOfCmdArgu_f = "-f";
        varQStrListPing << varQStrOfCmdArgu_f;
    }

    // 使用TTL
    if(ui->chBoxOfTTL1_1_5->isChecked())
    {
        varQStrOfCmdArgu_i = "-i";
        varQStrOfCmdArgu_i_Size = ui->spinBoxOfTTL1_1_3->text();
        varQStrListPing << varQStrOfCmdArgu_i << varQStrOfCmdArgu_i_Size;
    }

    // 使用源地址
    if(ui->chBoxOfSourceAddress1_1_3->isChecked())
    {
        varQStrOfCmdArgu_S = "-S";
        varQStrOfCmdArgu_S_sourceAdd = ui->comBoxOfSourceAddress1_1_1->currentText();
        varQStrListPing << varQStrOfCmdArgu_S << varQStrOfCmdArgu_S_sourceAdd;
    }

    // ipv4 ipv6
    if(ui->rButOfIPv41_1_1->isChecked())
    {
        varQStrOfCmdArgu_ip46 = "-4";
        varQStrListPing << varQStrOfCmdArgu_ip46;
    }
    else if(ui->rButOfIPv61_1_2->isChecked())
    {
        varQStrOfCmdArgu_ip46 = "-6";
        varQStrListPing << varQStrOfCmdArgu_ip46;
    }

    // 获取输入的目标 IP 地址
    varQStrOfCmdArgu_inetAddr = ui->linEdOfIPAddress1_1_1->text();
    varQStrOfCmdArgu_inetAddr.remove(QRegExp("\\s")); // 去除空格
    varQStrListPing << varQStrOfCmdArgu_inetAddr;

    /*
     * 分别在回显区和日志中写入命令格式和分隔符
     * */

    // 初始光标到末尾
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

    // 日志文件名的头
    QString varQStrLogType = "PING_ARP";
    // 命令格式
    QString varQStrOfViewCmdArg = "PING "+varQStrListPing.join(" ");

    // 在日志文件中显示分隔符和命令格式
    QString kongGeOfFengefu_01 = "\r\n\r\n";
    QString kongGeOfFengefu_02 = "\r\n";

    // 输出正常显示信息
    ui->txtEdOfMessage1_2_1->insertPlainText("\r\n\r\n");
    ui->txtEdOfMessage1_2_1->insertPlainText(varQStrOfViewCmdArg); // 把信息插入显示文本框
    ui->txtEdOfMessage1_2_1->insertPlainText("\r\n");
    // 在日志文件中显示分隔符和命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_01);
    // 分隔符 换行回车
    QString Fengefu_01 = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, Fengefu_01);
    // 在日志中写入执行的时间
    QString rightNow = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz \r\n");
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, rightNow);
    // 在日志中写入命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrOfViewCmdArg);
    // 换行回车
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_02);
    // 将光标移动到最后
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    // 更新显示
    ui->txtEdOfMessage1_2_1->update();

    ui->pusButOfArp1_1_2->setEnabled(false);

    connect(pObjOprOfPing,&QProcess::readyReadStandardOutput,this,&ClassForHostDiscover::funSlotsOfPingMessage);

    /*
     * 执行命令
     * */
    pObjOprOfPing->start(varCmdPing, varQStrListPing);

    if(pObjOprOfPing->waitForStarted())
    {
        pObjOprOfPing->setReadChannel(QProcess::StandardOutput);
    }
}

// 第一标签页 ARP 按钮点击事件
void ClassForHostDiscover::funSlotsOfArpClick()
{
    ChMSTextCodec ChMSTc;
    if(pObjOprOfArp->processId() > 0)
    {
        QByteArray varQByArrTemp = "ARP 命令已经停止。请重新点击 “ARP/stop” 按钮开始！";
        QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

        pObjOprOfPing->closeReadChannel(QProcess::StandardOutput);
        pObjOprOfPing->closeWriteChannel();
        pObjOprOfPing->terminate();
        pObjOprOfPing->kill();

        ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

        // 输出正常显示信息
        ui->txtEdOfMessage1_2_1->insertPlainText("\r\n\r\n");
        ui->txtEdOfMessage1_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
        ui->txtEdOfMessage1_2_1->insertPlainText("\r\n");
        ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage1_2_1->update(); // 更新显示
        return;
    }

    /*
     * 变量申请
     * */
    QString varQStrOfCmdArgu_a = "-a";
    QStringList varQStrListArgArp = {varQStrOfCmdArgu_a}; // 命令参数

    QString varCmdArp = "ARP "; // 路由追踪命令
    //QString varQStrOfCmdArgu_a_inetAddr = ""; // -a + 指定要查找的地址 参数
    QString varQStrOfCmdArgu_aN = "";
    QString varQStrOfCmdArgu_aN_ifAddr = ""; // -a -N 指定接口地址(源地址)

    QString varQStrOfCmdArgu_inetAddr = ""; // 目的IP地址

    // -N 参数 使用源地址
    if(ui->chBoxOfSourceAddress1_1_3->isChecked())
    {
        varQStrOfCmdArgu_aN = "-N";
        varQStrOfCmdArgu_aN_ifAddr = ui->comBoxOfSourceAddress1_1_1->currentText();
        varQStrListArgArp << varQStrOfCmdArgu_aN << varQStrOfCmdArgu_aN_ifAddr;
    }
    else
    {
        // 获取目的地址
        if(!ui->linEdOfIPAddress1_1_1->text().isEmpty())
        {
            varQStrOfCmdArgu_inetAddr = ui->linEdOfIPAddress1_1_1->text();
            varQStrListArgArp << varQStrOfCmdArgu_inetAddr;
        }
    }

    /*
     * 分别在回显区和日志中写入命令格式和分隔符
     * */

    // 初始光标到末尾
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

    // 日志文件名的头
    QString varQStrLogType = "PING_ARP";
    // 命令格式
    QString varQStrOfViewCmdArg = "ARP "+varQStrListArgArp.join(" ");

    // 在日志文件中显示分隔符和命令格式
    QString kongGeOfFengefu_01 = "\r\n\r\n";
    QString kongGeOfFengefu_02 = "\r\n";

    // 输出正常显示信息
    ui->txtEdOfMessage1_2_1->insertPlainText("\r\n\r\n");
    ui->txtEdOfMessage1_2_1->insertPlainText(varQStrOfViewCmdArg); // 把信息插入显示文本框
    ui->txtEdOfMessage1_2_1->insertPlainText("\r\n");
    // 在日志文件中显示分隔符和命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_01);
    // 分隔符 换行回车
    QString Fengefu_01 = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, Fengefu_01);
    // 在日志中写入执行的时间
    QString rightNow = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz \r\n");
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, rightNow);
    // 在日志中写入命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrOfViewCmdArg);
    // 换行回车
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_02);
    // 将光标移动到最后
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    // 更新显示
    ui->txtEdOfMessage1_2_1->update();

    ui->pusButOfPing1_1_1->setEnabled(false);

    connect(pObjOprOfArp,&QProcess::readyReadStandardOutput,this,&ClassForHostDiscover::funSlotsOfArpMessage);

    /*
     * 执行命令
     * */
    pObjOprOfArp->start(varCmdArp, varQStrListArgArp);

    if(pObjOprOfArp->waitForStarted())
    {
        pObjOprOfArp->setReadChannel(QProcess::StandardOutput);
    }
}

// 第一标签页 ping信息回显函数
void ClassForHostDiscover::funSlotsOfPingMessage()
{
    ChMSTextCodec ChMSTc;
    QString varQStrPingMess = ""; // 承载回显信息
    QString varQStrLogType = "PING_ARP"; // 标识这是谁产生的文件

    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

    /*
     * 输出正常显示信息
     * */
    QByteArray varQByArr = pObjOprOfPing->readAllStandardOutput(); // 读取回显信息
    varQStrPingMess = ChMSTc.funQStrTextCodec(varQByArr);
    ui->txtEdOfMessage1_2_1->insertPlainText(varQStrPingMess); // 把信息插入显示文本框
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
    ui->txtEdOfMessage1_2_1->update(); // 更新显示
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrPingMess);
}

// 第一标签页 arp信息回显函数
void ClassForHostDiscover::funSlotsOfArpMessage()
{
    ChMSTextCodec ChMSTc;
    QString varQStrPingMess = ""; // 承载回显信息
    QString varQStrLogType = "PING_ARP"; // 标识这是谁产生的文件

    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

    /*
     * 输出正常显示信息
     * */
    QByteArray varQByArr = pObjOprOfArp->readAllStandardOutput(); // 读取回显信息
    varQStrPingMess = ChMSTc.funQStrTextCodec(varQByArr);
    ui->txtEdOfMessage1_2_1->insertPlainText(varQStrPingMess); // 把信息插入显示文本框
    ui->txtEdOfMessage1_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
    ui->txtEdOfMessage1_2_1->update(); // 更新显示
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrPingMess);
}

// 第二标签页 获得本地 IPv6 地址
void ClassForHostDiscover::funSlotsOfGetLocalIPv6OfSecond()
{
    if(ui->rButOfIPv42_1_1->isChecked())
    {
        ui->chBoxOfRoundTripPath2_1_2->setChecked(false); // 默认补选中 追踪往返行程路径
        ui->chBoxOfRoundTripPath2_1_2->setEnabled(false); // 默认设置为不可用,因为默认为 IPV4 但是这是 IPV6 的参数
        ui->chBoxOfSourAddress2_1_3->setChecked(false); // 源IP 默认不选中
        ui->chBoxOfSourAddress2_1_3->setEnabled(false); // 源IP 默认不可用
        ui->comBoxOfSourceIP2_1_1->setEnabled(false); // 默认这里不可用
        ui->pusButOfRefreshIP2_1_2->setEnabled(false); // 默认 刷新IP地址 按钮不可用
        return;
    }

    //ui->chBoxOfRoundTripPath2_1_2->setChecked(false); // 默认补选中 追踪往返行程路径
    ui->chBoxOfRoundTripPath2_1_2->setEnabled(true); // 默认设置为不可用,因为默认为 IPV4 但是这是 IPV6 的参数
    //ui->chBoxOfSourAddress2_1_3->setChecked(false); // 源IP 默认不选中
    ui->chBoxOfSourAddress2_1_3->setEnabled(true); // 源IP 默认不可用
    ui->comBoxOfSourceIP2_1_1->setEnabled(true); // 默认这里不可用
    ui->pusButOfRefreshIP2_1_2->setEnabled(true); // 默认 刷新IP地址 按钮不可用

    // 判断是否已经有IP地址
    if(ui->comBoxOfSourceIP2_1_1->count() > 0)
    {
        ui->comBoxOfSourceIP2_1_1->clear();
    }
    QString varQStrLocalIPv6 = "";
    QString varQStrhostName = QHostInfo::localHostName();
    QHostInfo varQHostInfo = QHostInfo::fromName(varQStrhostName);
    QList<QHostAddress> varListOfIP = varQHostInfo.addresses();

    if(varListOfIP.empty()) // 判断是否无法获取IP地址
    {
        return;
    }
    foreach (QHostAddress addr, varListOfIP) {
        if((addr.protocol() == QAbstractSocket::IPv6Protocol) && ui->rButOfIPv62_1_2->isChecked()){ // 获取IPV6地址
            varQStrLocalIPv6 = addr.toString();
            ui->comBoxOfSourceIP2_1_1->addItem(varQStrLocalIPv6);
        }
    }
    //emit ClassForHostDiscover::clicked();
}

// 第二标签页 追踪 按钮 点击事件
void ClassForHostDiscover::funSlotOfTracertOfSecond()
{
    ChMSTextCodec ChMSTc;
    if(pObjOprOfTracert->processId() > 0)
    {
        QByteArray varQByArrTemp = "Tracert 路由追踪已经停止。请重新点击 “追踪/停止” 按钮开始追踪路由路径！";
        QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

        pObjOprOfTracert->closeReadChannel(QProcess::StandardOutput);
        pObjOprOfTracert->closeWriteChannel();
        pObjOprOfTracert->terminate();
        pObjOprOfTracert->kill();

        ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

        // 输出正常显示信息
        ui->txtEdOfMessage2_2_1->insertPlainText("\r\n\r\n");
        ui->txtEdOfMessage2_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
        ui->txtEdOfMessage2_2_1->insertPlainText("\r\n");
        ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage2_2_1->update(); // 更新显示
        return;
    }

    /*
     * 变量申请
     * */
    //QString varQStrOfErrorOfStart = ""; // 显示错误信息
    QStringList varQStrListArgTrac; // 命令参数

    QString varCmdTracert = "TRACERT "; // 路由追踪命令
    QString varQStrOfCmdArgu_DestAddr = ""; // IP地址/域名
    QString varQStrOfCmdArgu_d = ""; // 不将IP地址解析成主机名
    QString varQStrOfCmdArgu_h = ""; // 最大跃点数
    QString varQStrOfCmdArgu_h_count = ""; // 最大跃点数
    QString varQStrOfCmdArgu_w = ""; // 超时时间(毫秒)
    QString varQStrOfCmdArgu_w_count = ""; // 超时时间(毫秒)
    QString varQStrOfCmdArgu_R = ""; // 跟踪往返行程路径
    QString varQStrOfCmdArgu_S = ""; // 使用源地址
    QString varQStrOfCmdArgu_SrcAddr = ""; // 使用源地址的地址
    QString varQStrOfCmdArgu_IPv46 = ""; // IPv4 / IPv6

    /*
     * 变量赋值
     * */

    // 不将地址解析成主机名
    if(ui->chBoxOfNotResolvedHostname2_1_1->isChecked())
    {
        varQStrOfCmdArgu_d = "-d";
        varQStrListArgTrac.append(varQStrOfCmdArgu_d);
    }

    // 最大跃点数
    if(ui->chBoxOfMaximm_hops2_1_4->isChecked())
    {
        varQStrOfCmdArgu_h = "-h";
        varQStrOfCmdArgu_h_count = ui->spinBoxOfMaximm_hops2_1_1->text();
        varQStrListArgTrac.append(varQStrOfCmdArgu_h);
        varQStrListArgTrac.append(varQStrOfCmdArgu_h_count);
    }

    // 等待每个回复的超时时间(以毫秒为单位)
    if(ui->chBoxOfTimeout2_1_5->isChecked())
    {
        varQStrOfCmdArgu_w = "-w";
        varQStrOfCmdArgu_w_count = ui->spinBoxOfTimeout2_1_2->text();
        varQStrListArgTrac.append(varQStrOfCmdArgu_w);
        varQStrListArgTrac.append(varQStrOfCmdArgu_w_count);
    }

    // IP 版本选择
    if(ui->rButOfIPv42_1_1->isChecked())
    {
        varQStrOfCmdArgu_IPv46 = "-4";
        varQStrListArgTrac.append(varQStrOfCmdArgu_IPv46);
    }
    else if(ui->rButOfIPv62_1_2->isChecked())
    {
        varQStrOfCmdArgu_IPv46 = "-6";
        varQStrListArgTrac.append(varQStrOfCmdArgu_IPv46);

        // 跟踪返回行程路径
        if(ui->chBoxOfRoundTripPath2_1_2->isChecked())
        {
            varQStrOfCmdArgu_R = "-dR";
            varQStrListArgTrac.append(varQStrOfCmdArgu_R);
        }

        // 使用源地址
        if(ui->chBoxOfSourAddress2_1_3->isChecked())
        {
            varQStrOfCmdArgu_S = "-S";
            varQStrOfCmdArgu_SrcAddr = ui->comBoxOfSourceIP2_1_1->currentText();
            varQStrListArgTrac.append(varQStrOfCmdArgu_S);
            varQStrListArgTrac.append(varQStrOfCmdArgu_SrcAddr);
        }
    }

    // 获取输入的IP地址或者域名
    varQStrOfCmdArgu_DestAddr = ui->linEdOfDestAddress2_1_1->text();
    varQStrOfCmdArgu_DestAddr.remove(QRegExp("\\s"));
    varQStrListArgTrac.append(varQStrOfCmdArgu_DestAddr);

    /*
     * 分别在回显区和日志中写入命令格式和分隔符
     * */

    // 初始光标到末尾
    ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

    // 日志文件名的头
    QString varQStrLogType = "Tracert";
    // 命令格式
    QString varQStrOfViewCmdArg = "tracert "+varQStrListArgTrac.join(" ");

    // 在日志文件中显示分隔符和命令格式
    QString kongGeOfFengefu_01 = "\r\n\r\n";
    QString kongGeOfFengefu_02 = "\r\n";

    // 输出正常显示信息
    ui->txtEdOfMessage2_2_1->insertPlainText("\r\n\r\n");
    ui->txtEdOfMessage2_2_1->insertPlainText(varQStrOfViewCmdArg); // 把信息插入显示文本框
    ui->txtEdOfMessage2_2_1->insertPlainText("\r\n");
    // 在日志文件中显示分隔符和命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_01);
    // 分隔符 换行回车
    QString Fengefu_01 = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, Fengefu_01);
    // 在日志中写入执行的时间
    QString rightNow = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz \r\n");
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, rightNow);
    // 在日志中写入命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrOfViewCmdArg);
    // 换行回车
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_02);
    // 将光标移动到最后
    ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    // 更新显示
    ui->txtEdOfMessage2_2_1->update();

    connect(pObjOprOfTracert,&QProcess::readyReadStandardOutput,this,&ClassForHostDiscover::funVoidTracertMessage);

    /*
     * 执行命令
     * */
    pObjOprOfTracert->start(varCmdTracert, varQStrListArgTrac);

    if(pObjOprOfTracert->waitForStarted())
    {
        pObjOprOfTracert->setReadChannel(QProcess::StandardOutput);
    }
}

// 第二标签页 信息回显函数
void ClassForHostDiscover::funVoidTracertMessage()
{
    ChMSTextCodec ChMSTc;
    QString varQStrTcpMess = ""; // 承载回显信息
    QString varQStrLogType = "Tracert"; // 标识这是谁产生的文件

    ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

    /*
     * 输出正常显示信息
     * */
    QByteArray varQByArr = pObjOprOfTracert->readAllStandardOutput(); // 读取回显信息
    varQStrTcpMess = ChMSTc.funQStrTextCodec(varQByArr);
    ui->txtEdOfMessage2_2_1->insertPlainText(varQStrTcpMess); // 把信息插入显示文本框
    ui->txtEdOfMessage2_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
    ui->txtEdOfMessage2_2_1->update(); // 更新显示
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrTcpMess);
}


// 第三标签 点击 探测 按钮事件
void ClassForHostDiscover::funVoidTcpCmdArguments()
{
    ChMSTextCodec ChMSTc;
    if(pObjQprOfTcpPort->processId() > 0)
    {
        QByteArray varQByArrTemp = "TCPing 探测已经停止。请重新点击 “探测” 按钮开始探测！";
        QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

        pObjQprOfTcpPort->closeReadChannel(QProcess::StandardOutput);
        pObjQprOfTcpPort->closeWriteChannel();
        pObjQprOfTcpPort->terminate();
        pObjQprOfTcpPort->kill();

        ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

        // 输出正常显示信息
        ui->txtEdOfMessage3_2_1->insertPlainText("\r\n\r\n");
        ui->txtEdOfMessage3_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
        ui->txtEdOfMessage3_2_1->insertPlainText("\r\n");
        ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage3_2_1->update(); // 更新显示
        return;
    }
    /*
     * 变量申请
     * */
    QString varQStrCmdArg = ""; //
    QStringList varQStrListArguments; // 命令参数

    QString varCmdTcping = ""; // TCP探测命令

    QString varQStrOfCmdArgu_tn = ""; // 长ping
    QString varQStrOfCmdArgu_tn_count = ""; // 发送几次

    QString varQStrOfCmdArgu_i = ""; // 间隔几秒
    QString varQStrOfCmdArgu_i_count = ""; // 间隔几秒

    QString varQStrOfCmdArgu_j = ""; // 抖动

    QString varQStrOfCmdArgu_d = ""; // 日期时间

    QString varQStrOfCmdArgu_r = ""; // 重新解析
    QString varQStrOfCmdArgu_r_count = ""; // 重新解析

    QString varQStrOfCmdArgu_h = ""; // HTTP模式
    QString varQStrOfCmdArgu_hPost = ""; // HTTP模式 发送 post 请求
    QString varQStrOfCmdArgu_hHead = ""; // HTTP模式 发送 head 请求

    QString varQStrOfCmdArgu_sg = ""; // 成功退出
    QString varQStrOfCmdArgu_sg_count = ""; // 失败几次

    QString varQStrOfCmdArgu_f = ""; // 至少发送一个字节

    QString varQStrOfCmdArgu_S = ""; // 使用源地址
    QString varQStrOfCmdArgu_S_sourceAdd = ""; // 使用源地址

    QString varQStrOfCmdArgu_ip46 = ""; // ipv4

    QString varQStrOfCmdArgu_serverAdd = ""; // ip地址

    QString varQStrOfCmdArgu_port = ""; // 端口号


    /*
     * 变量赋值
     * */

    // 要使用的 tcping 命令的名称
    varCmdTcping = "chmsTcping.exe";



    // 长ping/发送几次
    if(ui->chBoxOfPerPing3_1_2->isChecked())
    {
        varQStrOfCmdArgu_tn = "-t";
        varQStrListArguments << varQStrOfCmdArgu_tn;
    }
    else
    {
        if(ui->spinBoxOfCountPing3_1_1->text().toInt() > 0)
        {
            varQStrOfCmdArgu_tn = "-n";
            varQStrOfCmdArgu_tn_count = ui->spinBoxOfCountPing3_1_1->text();
            varQStrListArguments << varQStrOfCmdArgu_tn << varQStrOfCmdArgu_tn_count;
        }
    }

    // 间隔时间
    if(ui->chBoxOfTimer3_1_9->isChecked())
    {
        varQStrOfCmdArgu_i = "-i";
        varQStrOfCmdArgu_i_count = ui->spinBoxOfTimer3_1_2->text();
        varQStrListArguments << varQStrOfCmdArgu_i << varQStrOfCmdArgu_i_count;
    }

    // 显示日期和时间
    if(ui->chBoxOfDateTime3_1_6->isChecked())
    {
        varQStrOfCmdArgu_d = "-d";
        varQStrListArguments << varQStrOfCmdArgu_d;
    }

    // 抖动
    if(ui->chBoxOfJitter3_1_8->isChecked())
    {
        varQStrOfCmdArgu_j = "-j";
        varQStrListArguments << varQStrOfCmdArgu_j;
    }

    // 重新解析
    if(ui->chBoxOfReload3_1_10->isChecked())
    {
        varQStrOfCmdArgu_r = "-r";
        varQStrOfCmdArgu_r_count = ui->spinBoxOfReload3_1_5->text();
        varQStrListArguments << varQStrOfCmdArgu_r << varQStrOfCmdArgu_r_count;
    }

    // HTTP 模式
    if(ui->chBoxOfHTTP3_1_1->isChecked())
    {
        varQStrOfCmdArgu_h = "-h";
        varQStrListArguments << varQStrOfCmdArgu_h;
        // 使用 post 请求
        if(ui->chBoxOfPost3_1_4->isChecked())
        {
            varQStrOfCmdArgu_hPost = "--post";
            varQStrListArguments << varQStrOfCmdArgu_hPost;
        }
        // 使用 head 请求
        if(ui->chBoxOfHead3_1_5->isChecked())
        {
            varQStrOfCmdArgu_hHead = "--head";
            varQStrListArguments << varQStrOfCmdArgu_hHead;
        }
    }

    // 成功后退出,或者失败几次后退出
    if(ui->chBoxOfSucceed3_1_7->isChecked())
    {
        if(ui->spinBoxOfFail3_1_4->text().toInt() == 0)
        {
            // 成功就退出
            varQStrOfCmdArgu_sg = "-s";
            varQStrListArguments << varQStrOfCmdArgu_sg;
        }
        else
        {
            // 失败几次后退出
            varQStrOfCmdArgu_sg = "-g";
            varQStrOfCmdArgu_sg_count = ui->spinBoxOfFail3_1_4->text();
            varQStrListArguments << varQStrOfCmdArgu_sg << varQStrOfCmdArgu_sg_count;
        }
    }

    // 至少发送一个字节
    if(ui->chBoxOfArgf3_1_11->isChecked())
    {
        varQStrOfCmdArgu_f = "-f";
        varQStrListArguments << varQStrOfCmdArgu_f;
    }

    // 使用源地址
    if(ui->chBoxOfSourPing3_1_3->isChecked())
    {
        varQStrOfCmdArgu_S = "-S";
        varQStrOfCmdArgu_S_sourceAdd = ui->comBoxOfSourceIP3_1_1->currentText();
        varQStrListArguments << varQStrOfCmdArgu_S << varQStrOfCmdArgu_S_sourceAdd;
    }

    // IP 协议版本 v4 v6
    if(ui->rButOfIPv43_1_5->isChecked())
    {
        varQStrOfCmdArgu_ip46 = "-4";
        varQStrListArguments << varQStrOfCmdArgu_ip46;
    }
    else if(ui->rButOfIPv63_1_6->isChecked())
    {
        varQStrOfCmdArgu_ip46 = "-6";
        varQStrListArguments << varQStrOfCmdArgu_ip46;
    }

    // 获取目的地址 IP/域名
    varQStrOfCmdArgu_serverAdd = ui->linEdOfDestAddress3_1_1->text();
    varQStrOfCmdArgu_serverAdd.remove(QRegExp("\\s"));
    varQStrListArguments << varQStrOfCmdArgu_serverAdd;

    // 获取端口号
    varQStrOfCmdArgu_port = ui->spinBoxOfPort3_1_3->text();
    varQStrListArguments << varQStrOfCmdArgu_port;

    /*
     * 分别在回显区和日志中写入命令格式和分隔符
     * */

    // 初始光标到末尾
    ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

    // 在回显区输出命令格式
    QString varQStrLogType = "Tcping";
    QString varQStrOfViewCmdArg = "tcping "+varQStrListArguments.join(" ");

    // 在日志文件中显示分隔符和命令格式
    QString kongGeOfFengefu_01 = "\r\n\r\n";
    QString kongGeOfFengefu_02 = "\r\n";

    ui->txtEdOfMessage3_2_1->insertPlainText("\r\n\r\n");
    ui->txtEdOfMessage3_2_1->insertPlainText(varQStrOfViewCmdArg); // 输出命令格式
    ui->txtEdOfMessage3_2_1->insertPlainText("\r\n");

    // 在日志文件中显示分隔符和命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_01);
    // 分隔符 换行回车
    QString Fengefu_01 = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, Fengefu_01);
    // 在日志中写入执行的时间
    QString rightNow = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz \r\n");
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, rightNow);
    // 在日志中写入命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrOfViewCmdArg);
    // 换行回车
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_02);
    // 将光标移动到最后
    ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    // 更新显示
    ui->txtEdOfMessage3_2_1->update();

    /*
     * 信号槽 : 回显信息
     * */
    connect(pObjQprOfTcpPort,&QProcess::readyReadStandardOutput,this,&ClassForHostDiscover::funVoidTcpPortMessage);

    /*
     * 执行命令
     * */
    pObjQprOfTcpPort->start(varCmdTcping,varQStrListArguments);

    if(pObjQprOfTcpPort->waitForStarted())
    {
        //
        pObjQprOfTcpPort->setReadChannel(QProcess::StandardOutput);
    }
    else
    {
        /*
         * 输出错误信息
         * */
        varQStrCmdArg = QString::fromLocal8Bit(pObjQprOfTcpPort->readAllStandardError()); // 读取回显信息
        ui->txtEdOfMessage3_2_1->insertPlainText(varQStrCmdArg); // 把信息插入显示文本框
        ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage3_2_1->update(); // 更新显示
    }
}

// 第三标签 信息回显函数
void ClassForHostDiscover::funVoidTcpPortMessage()
{
    ChMSTextCodec ChMSTc;
    QString varQStrTcpMess = ""; // 承载回显信息
    QString varQStrLogType = "Tcping"; // 标识这是谁产生的文件

    ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

    /*
     * 输出正常显示信息
     * */
    QByteArray varQByArr = pObjQprOfTcpPort->readAllStandardOutput(); // 读取回显信息
    varQStrTcpMess = ChMSTc.funQStrTextCodec(varQByArr);
    ui->txtEdOfMessage3_2_1->insertPlainText(varQStrTcpMess); // 把信息插入显示文本框
    ui->txtEdOfMessage3_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
    ui->txtEdOfMessage3_2_1->update(); // 更新显示
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrTcpMess);
}

// 第四标签页 点击 解析 按钮事件
void ClassForHostDiscover::funSlotsOfNslookup()
{
    ChMSTextCodec ChMSTc;
    if(pObjQprOfNslookup->processId() > 0)
    {
        QByteArray varQByArrTemp = "TCPing 探测已经停止。请重新点击 “探测” 按钮开始探测！";
        QString varUnicodeTmp1 = ChMSTc.funQStrTextCodec(varQByArrTemp);

        pObjQprOfNslookup->closeReadChannel(QProcess::StandardOutput);
        pObjQprOfNslookup->closeWriteChannel();
        pObjQprOfNslookup->terminate();
        pObjQprOfNslookup->kill();

        ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

        // 输出正常显示信息
        ui->txtEdOfMessage4_2_1->insertPlainText("\r\n\r\n");
        ui->txtEdOfMessage4_2_1->insertPlainText(varUnicodeTmp1); // 把信息插入显示文本框
        ui->txtEdOfMessage4_2_1->insertPlainText("\r\n");
        ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
        ui->txtEdOfMessage4_2_1->update(); // 更新显示
        return;
    }
    /*
     * 变量申请
     * */
    QString varQStrCmdArg = "nslookup"; // 命令
    QStringList varQStrListArguments; // 命令参数

    // 获取 输入的域名
    QString varQStrLinEdTxt = ui->linEdOfDomainName4_1_1->text();
    // 去除空格
    varQStrLinEdTxt.remove(QRegExp("\\s"));

    if(varQStrLinEdTxt.isEmpty())
    {
        QByteArray varQByArrWarning01 = "必须输入域名";
        QString varQStrWarning01 = ChMSTc.funQStrTextCodec(varQByArrWarning01);
        //ui->linEdOfDomainName4_1_1->insert(varQStrWarning01);
        ui->txtEdOfMessage4_2_1->insertPlainText(varQStrWarning01); // 把信息插入显示文本框
        ui->txtEdOfMessage4_2_1->insertPlainText("\r\n\r\n");
        return;
    }

    // 将输入的域名加入参数
    varQStrListArguments << varQStrLinEdTxt;

    if(ui->chBoxOfDns4_1_1->isChecked())
    {
        // 获取 DNS 服务器地址
        QString varQStrOfComboTxt = ui->comBoxOfDnsList4_1_1->currentText();
        varQStrOfComboTxt.remove(QRegExp("\\s")); // 删除空格
        // 将获取的 DNS 服务器加入参数
        varQStrListArguments << varQStrOfComboTxt;
    }


    /*
     * 分别在回显区和日志中写入命令格式和分隔符
     * */

    // 初始光标到末尾
    ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

    // 在回显区输出命令格式
    QString varQStrLogType = "nslookup.exe";
    QString varQStrOfViewCmdArg = "nslookup "+varQStrListArguments.join(" ");

    // 在日志文件中显示分隔符和命令格式
    QString kongGeOfFengefu_01 = "\r\n\r\n";
    QString kongGeOfFengefu_02 = "\r\n";

    ui->txtEdOfMessage4_2_1->insertPlainText("\r\n\r\n");
    ui->txtEdOfMessage4_2_1->insertPlainText(varQStrOfViewCmdArg); // 输出命令格式
    ui->txtEdOfMessage4_2_1->insertPlainText("\r\n");

    // 在日志文件中显示分隔符和命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_01);
    // 分隔符 换行回车
    QString Fengefu_01 = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, Fengefu_01);
    // 在日志中写入执行的时间
    QString rightNow = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz \r\n");
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, rightNow);
    // 在日志中写入命令格式
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrOfViewCmdArg);
    // 换行回车
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, kongGeOfFengefu_02);
    // 将光标移动到最后
    ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    // 更新显示
    ui->txtEdOfMessage4_2_1->update();

    /*
     * 信号槽 : 回显信息
     * */
    connect(pObjQprOfNslookup,&QProcess::readyReadStandardOutput,this,&ClassForHostDiscover::funVoidNslookupMessage);

    /*
     * 执行命令
     * */
    pObjQprOfNslookup->start(varQStrCmdArg, varQStrListArguments);

    if(pObjQprOfNslookup->waitForStarted())
    {
        //
        pObjQprOfNslookup->setReadChannel(QProcess::StandardOutput);
    }
}

// 第四标签页 信息回显函数
void ClassForHostDiscover::funVoidNslookupMessage()
{
    ChMSTextCodec ChMSTc;
    QString varQStrTcpMess = ""; // 承载回显信息
    QString varQStrLogType = "Nslookup"; // 标识这是谁产生的文件

    ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 初始光标到末尾

    /*
     * 输出正常显示信息
     * */
    QByteArray varQByArr = pObjQprOfNslookup->readAllStandardOutput(); // 读取回显信息
    varQStrTcpMess = ChMSTc.funQStrTextCodec(varQByArr);
    ui->txtEdOfMessage4_2_1->insertPlainText(varQStrTcpMess); // 把信息插入显示文本框
    ui->txtEdOfMessage4_2_1->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // 将光标移动到最后
    ui->txtEdOfMessage4_2_1->update(); // 更新显示
    ClassForHostDiscover::funVoidRunLogOfWrite(varQStrLogType, varQStrTcpMess);
}

// 第四标签页 获取 DNS INI 中的配置
void ClassForHostDiscover::funVoidReadDnsIni()
{
    ChMSAppPath StructAppPath; // INI 配置文件路径
    QStringList varQStrListOfDnsItem; // 保存获取的 配置文件 key 部分（配置文件由 key 和 value 两部分组成）
    //QStringList varQStrListOfSendDnsData; // 保存获取配置文件 vlaue 部分到 QStringList
    QString varQStrOfDnsItem = ""; // 保存获取的配置文件 value 部分到 QString
    QSettings readDnsIniSetting(StructAppPath.iniOfDNSPath,QSettings::IniFormat); // 建立 QSettings 对象，并打开INI文件
    readDnsIniSetting.setIniCodec("UTF-8"); // 设置INI文件编码
    readDnsIniSetting.beginGroup("DNS_Servers"); // 要读取的组名字
    varQStrListOfDnsItem = readDnsIniSetting.allKeys(); // 读取INI中所有 Key
    readDnsIniSetting.endGroup(); // 组结束

    // 以下是再一次通过读取出的 key 再读取出 key 的 value 值
    readDnsIniSetting.beginGroup("DNS_Servers");
    for(QStringList::Iterator i = varQStrListOfDnsItem.begin(); i != varQStrListOfDnsItem.end(); i++)
    {
        varQStrOfDnsItem = readDnsIniSetting.value(*i).toString();
        varQStrListOfSendDnsData << varQStrOfDnsItem;
    }
    readDnsIniSetting.endGroup();
}

// 第四标签页 获取DNS地址 赋值给 comboBox 控件
void ClassForHostDiscover::funVoidAddItemToCombo()
{
    ui->comBoxOfDnsList4_1_1->clear();
    ui->comBoxOfDnsList4_1_1->addItems(varQStrListOfSendDnsData);
}

// 第四标签页 打开 DNS 列表编辑窗口
void ClassForHostDiscover::funSlotsOfOpenDnsEditForm()
{
    //ClassForHostDiscover::funVoidReadDnsIni(); // 获取 DNS INI 中的配置

    emit signalOfSend2DnsForm(varQStrListOfSendDnsData);

    pFormOfDnsIni -> setModal(true);
    pFormOfDnsIni -> show();
    pFormOfDnsIni -> update();

}

// 第四标签页 接收和处理子窗口传回的数据
void ClassForHostDiscover::funSlotsOfProcessingDataForSub(QStringList &comList)
{
    ui->comBoxOfDnsList4_1_1->clear();
    varQStrListOfSendDnsData.clear();
    varQStrListOfSendDnsData << comList;
    ui->comBoxOfDnsList4_1_1->addItems(comList);
}

























